﻿#include <iostream>

using namespace std;

/// <summary>
/// 返回引用
/// </summary>
/// <returns></returns>
int& rtnRef();
/// <summary>
/// 引用作为参数
/// </summary>
/// <param name="ref"></param>
void doRef(int& ref);
/// <summary>
/// 指针相关
/// </summary>
/// <param name="void">空</param>
/// <returns></returns>
int mainPtr(void) {

	//指向指针的指针
	int** i_ptr_ptr = nullptr;

	int i = 10;
	int* i_ptr = &i;
	i_ptr_ptr = &i_ptr;

	cout << **i_ptr_ptr << endl;

	return 1;
}
/// <summary>
/// 空指针
/// </summary>
/// <param name=""></param>
void NULL_POINTER(void) {
	/*
		指针是变量，其值为内存地址，使用[变量类型]* 变量名称表示一个指针
	*/
	double d_val = 0.1;
	double* d_val_p = &d_val;//double 类型的指针

	int* i_val_p = NULL;//定义一个int类型的指针，其初始值为空指针，注意：空指针也是一个指针 其值为0
	cout << NULL << endl;
	float* f_val_p = nullptr;//c11后推荐使用nullptr来代表空指针
}
/// <summary>
/// 指针与数组
/// </summary>
/// <param name=""></param>
void POINTER_ARRAY(void) {
	int varMax[4] = { 10, 100, 1000, 10000 };
	int* valMaxPtr = varMax;

	for (int i = 0; i < sizeof(varMax) / sizeof(int); i++) {
		//cout << *valMaxPtr << endl;
		////指针移动到下个位置
		//valMaxPtr++;
		cout << valMaxPtr[i] << endl;
	}

}
/// <summary>
/// 数组指针与指针数组
/// </summary>
/// <param name=""></param>
void PTR_ARR_ARR_PTR(void) {
	//存储int类型指针的数组 又叫做指针数组
	int* ptrArr[3];
	//指针数组，一个数组的指针 一个存储了3个int类型的值的数组的指针，也可用于表达多维数组的指针
	int arr[3] = { 1,2,3 };
	int(*arrPtr)[3] = &arr;
	//表达多维数组的指针
	int marr[3][3] = {
		{1,2,3},{4,5,6},{7,8,9}
	};
	int(*marrPtr)[3] = marr;
}